3.3. 함수

함수

함수는 fn 키워드를 사용한다.
러스트에서는 함수를 선언만 하면 메인의 위아래 상관없이 실행 가능하다.
Pasted image 20240430234649.png
매개변수를 만들 때는 타입을 명시해준다.
이는 함수가 변수를 사용할 때 타입을 추론하지 않아도 된다는 설계 아래 의도된 바이다.

구문과 표현식

러스트에서는 구문과 표현식을 구분하는 것이 중요하다.

let y = 6;

이런 건 평범한 구문이다.
c언어는 구문이 반환값이 존재하는데 러스트는 그렇지 않다.
반면 표현식은 결과가 존재한다.

5+6

이것은 11이라는 결과값이 존재하는 표현식이다.
표현식은 당연히 구문의 일부일 수 있다.
함수 호출, 매크로 호출, 중괄호로 쌓인 블록도 표현식이다.

{
	let x  = 3;
	x + 1
}

놀랍게도 이것도 표현식이다.
잘 보면 마지막 줄은 세미콜론을 넣지 않았다.
세미콜론을 넣는 순간 표현식은 구문으로 변경되고, 값이 반환되지 않는다.
Pasted image 20240501001946.png
이런 식의 코드는 문제 없다는 것이다.

반환값을 가진 함수

당연히 함수는 리턴할 수 있다.
반환값이 명명될 필요는 없지만, 타입은 명시되어야 한다.
반환값은 마지막 표현식이다.
물론 return을 통해 반환하는 것도 가능하다.

fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {x}");
}

놀랍게도 이런 코드가 성립한다는 것이다.
만약 five 함수에 세미콜론이 붙었다면, 해당 코드는 구문이 되고 함수는 유닛, 즉 ()을 반환했을 것이다.
그렇다면 x는 아무것도 받지 못했다고 판단되며 에러가 나게 된다.
이런 에러에 대해서도 컴파일러는 세미콜론을 제거하라고 친절하게 충고해준다.